package com.wangshb.agent.study.javassist;


import javassist.*;

import java.lang.reflect.Method;

/**
 * 利用字节码实现简单的 hello world
 */
public class HelloWorld {

    public static void main(String[] args) throws Exception {

        ClassPool pool = ClassPool.getDefault();

        // 创建一个java类
        CtClass ctClass = pool.makeClass("com.wangshb.agent.javassist.HelloWorld");

        // 创建一个main方法，返回类型为void, 参数为String数组
        CtMethod ctMethod = new CtMethod(CtClass.voidType, "main",
                new CtClass[]{pool.get(String[].class.getName())}, ctClass);
        // 设置方法为公有的静态方法
        ctMethod.setModifiers(Modifier.PUBLIC + Modifier.STATIC);
        ctMethod.setBody("{System.out.println(\"你好 javassist\");}");
        ctClass.addMethod(ctMethod);

        CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass);
        ctConstructor.setBody("{}");
        ctClass.addConstructor(ctConstructor);

        ctClass.writeFile();

        Class<?> aClass = ctClass.toClass();
        Object o = aClass.newInstance();
        Method main = aClass.getDeclaredMethod("main", String[].class);
        main.invoke(o, (Object) new String[1]);
    }
}
